// 自己实现hyapply
Function.prototype.hyapply = function (thisArg, argArray) {
  // 1.获取需要被执行的函数
  var fn = this
  // 2.对thisArg转成对象类型(防止它传入的是非对象类型) 并判断边界条件
  thisArg = (thisArg !== null && thisArg !== undefined) ? Object(thisArg) : window
  // 3.调用需要被执行的函数
  thisArg.fn = fn
  // 判断下参数是否有值再执行
  var result = argArray ? thisArg.fn(...argArray) : thisArg.fn()
  // var result = thisArg.fn(...argArray)
  delete thisArg.fn
  // 4.将最终的结果返回出去
  return result
}

function sum(num1, num2) {
  console.log('sum被调用', this, num1, num2);
  return num1 + num2
}

function foo(num) {
  return num
}

function bar() {
  console.log('bar函数被执行');
}

// 系统调用
// var result = sum.apply('abc', [20, 30])
// console.log(result);

// 自己实现的调用
var result = sum.hyapply('abc', [20, 30])
console.log(result);

var result2 = foo.hyapply('abc', [20])
console.log(result2);

bar.hyapply('abc')